﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using BusinessLogicLayer.Validation;
using Entities;
using Utilities;
using DataAccessLayer;
using System.Linq.Expressions;

namespace BusinessLogicLayer
{
    public class MonHocManager : IValidation<MonHoc>
    {
        private readonly IRepository<MonHoc> _repository;

        public MonHocManager(IRepository<MonHoc> itr)
        {
            _repository = itr;
        }

        public ValidationResult Validate(MonHoc monhoc)
        {
            var vResult = new ValidationResult();

            if (string.IsNullOrEmpty(monhoc.TenMH.Trim()))
                vResult.Messages.Add("Tên môn học phải khác chuỗi rỗng");

            if (monhoc.SoTCLT <= 0)
                vResult.Messages.Add("Số tín chỉ lý thuyết phải lớn hơn 0");

            if (monhoc.STC > 5 || monhoc.STC <= 0)
                vResult.Messages.Add("Tổng số tín chỉ phải từ 0 đến 5");
            return vResult;
        }


        public ActionResult InsertOrUpdate(MonHoc monhoc)
        {
            var aResult = new ActionResult();
            try
            {
                if (!_repository.InsertOrUpdate(monhoc))
                    aResult.ex.Add(new Exception("Thêm mới môn học không thành công"));
            }
            catch (Exception ex)
            {
                aResult.ex.Add(ex);
            }
            return aResult;
        }

        public ActionResult Delete(MonHoc monhoc)
        {
            var aResult = new ActionResult();
            try
            {
                if (!_repository.Delete(monhoc))
                    aResult.ex.Add(new Exception("Xóa thông tin môn học không thành công"));
            }
            catch (Exception ex)
            {
                aResult.ex.Add(ex);
            }
            return aResult;
        }

        public ActionResult Delete(string monhocId)
        {
            var aResult = new ActionResult();
            try
            {
                if (!_repository.Delete(t => t.MaMH == monhocId))
                    aResult.ex.Add(new Exception("Xóa thông tin môn học không thành công"));
            }
            catch (Exception ex)
            {
                aResult.ex.Add(ex);
            }
            return aResult;
        }

        public ActionResultAsList<MonHoc> Find(Expression<Func<MonHoc, bool>> predicate)
        {
            var aResult = new ActionResultAsList<MonHoc>();
            try
            {
                aResult.Result = _repository.Find(predicate).ToList();
                if (aResult.Result.Count == 0)
                    aResult.ex.Add(new Exception("Không tìm thấy môn học thỏa điều kiện"));
            }
            catch (Exception ex)
            {
                aResult.ex.Add(ex);
            }
            return aResult;
        }
    }
}
